/*
 * Classe ListThree
 *                          - Obtem os dados da lista 3 da base de dados (SQLite3 + ADO.NET) 
 * 							- Guarda esses dados numa Lista (C# Collections)
 * 							- Ordena os dados
 * 							- Escreve os resultados na consola e no ficheiro de texto respectivo
 *							
 *
 *@Author: Fábio Miguel Vitória Carreto - 5618 - Engenharia Informática - Diurno
 *@Version: 03/07/2011
 * 
 * 
 * */

using System;
using System.Collections.Generic;
using System.Data;
using Mono.Data.SqliteClient;
using System.IO;

public class ListThree
{
	
	public ListThree ()
	{
		//Para cada ano executa os seguintes métodos
		for(int ano = 0 ; ano < 10 ; ano++)
		{
			List<StructListThree> listThree = this.getData(ano);
			List<StructListThree> listOrdenada = this.mostraListaOrdenada(listThree);
			this.showResultsConsole(listOrdenada, ano);
			this.showResultsFile(listOrdenada, ano);	
		}

	}
	
	//Ordena os dados por ordem alfabética do nome de estabelecimento
	public List<StructListThree> mostraListaOrdenada(List<StructListThree> list)
	{
		list.Sort(delegate(StructListThree s1, StructListThree s2) { return s1.estabelecimento.CompareTo(s2.estabelecimento); });
		
		return list;
	}
	
	//Mostra resultados na consola
	public void showResultsConsole(List<StructListThree> list, int ano)
	{
		
		Console.WriteLine("ANO DE 200" + ano + "\nESTABELECIMENTOS:");
		Console.WriteLine("\nResultados (Ordenados por Ordem Alfabética em Cada Ano): \n");
		list.ForEach(delegate(StructListThree s) 
		{ 
			Console.WriteLine(s.estabelecimento); 
		});
		
	}
	
	//Mostra resultados no ficheiro respectivo
	public void showResultsFile(List<StructListThree> list, int ano)
	{
		string file = "Listas/listThree.txt";
		
		if(ano == 0)
		{
			
			TextWriter tw = new StreamWriter(file);
			tw.WriteLine(DateTime.Now);
			tw.WriteLine("Sistema Operativo: " + Environment.OSVersion.ToString());
			tw.WriteLine("");
			tw.WriteLine("Lista 3 - Estabelecimentos em cada ano");
			tw.WriteLine(Environment.NewLine + "(Resultados ordenados por ordem alfabética em cada ano)");
			tw.Close();
			
		}
		
		
		
		list.ForEach(delegate(StructListThree s) 
		{
			File.AppendAllText(file, String.Format("Ano = 200{0}, Estabelecimento = {1}" + 
			                                       Environment.NewLine, s.year, s.estabelecimento));
		});
		
		File.AppendAllText(file, Environment.NewLine + Environment.NewLine);
		
		Console.WriteLine("\nOs resultados da lista 3 foram também guardados em ficheiro de texto.");
		Console.WriteLine("Localização: " + file);
		
	}
	
	//Obtém os dados da lista e retorna-os numa lista de objectos
	public List<StructListThree> getData(int ano)
	{
		string connectionString = "URI=file:rebides.db,version=3";
		IDbConnection dbcon;
		dbcon = (IDbConnection) new SqliteConnection(connectionString);
		dbcon.Open();
		IDbCommand dbcmd = dbcon.CreateCommand();
		
		List<StructListThree> list = new List<StructListThree>();
		IDataReader reader = null;
		
		//Obtem-se todos os nomes de estabelecimento para o ano pretendido
		string sql = "SELECT DISTINCT designacao FROM estabelecimento WHERE ano = " + ano;
		dbcmd.CommandText = sql;
		reader = dbcmd.ExecuteReader();
		
		while(reader.Read()) 
		{
			string estabelecimento = reader.GetString (0);
			//Adiciona-se cada resultado à lista de objectos respectiva
			list.Add(new StructListThree(ano, estabelecimento));
		}
		
		
		return list;
		
	}
}

//Objecto que servirá de base à lista
//Tem como atributos o ano o nome do estabelecimento
public class StructListThree
{
	public int year;
	public string estabelecimento;
	
	public StructListThree(int year, string estabelecimento)
	{
		this.year = year;
		this.estabelecimento = estabelecimento;
	}
}